/*
题目：
用数组实现单词两两接龙。 

操作要求： 
输入单词 ，遍历除自己本身的单词
判断两个单词是否有包含 
有包含则满足接龙规则，输出。

核心思路：
①for循环实现五个单词的输入
②利用字符串结尾为'\0'实现字符串截取
③strcmp函数实现截取片段比较，判断接龙条件
④利用指针进行偏移，实现对字符数组中每个元素的操作 
*/

#include <stdio.h>
#include <string.h>
#define N 20

/*指针函数实现两两接龙*/
char *com(char a[N],char b[N]){  
	char c[N],d[N];
	int la=0,lb=0,lm=0;
	int i,t;
	char *pa,*pb,*pc,*pd,*pe;
	
	pa=a;
	pb=b;
	pe=0; 
	
	la=strlen(pa);           //分别求两单词长度 
	lb=strlen(pb);
	
	if(la<lb)               //记录两个单词中，较短单词的长度      
		lm=la;
	else
		lm=lb;
		
	for(i=0;i<lm;i++){     //遍历两个单词，判断包含关系 
		pc=c;
		pd=d;
		
		strcpy(pc,pa);
		strcpy(pd,pb);
		
		*(pd+lm-i)='\0';           //利用字符串结尾为'\0'实现字符串截取 
		t=strcmp(pc+la-lm+i,pd);   //截断字符串进行比较，判断接龙条件 
		
		if(t==0){                  //判断是否包含(能否接龙) 
			*(pc+la-lm+i)='\0';
			pe=strcat(pc,pb);      //存储接龙后的字符串 
			break;
		}
	}
	puts(pe);
	return pe;
}

/*空函数求两两接龙方案*/
void len(char a[5][N]){       
	char *p,*q;
	int i,j,k,n=0;
	
	printf("两两接龙的所有情况如下:\n");
	for(i=0;i<5;i++){        //双循环遍历除自身外的每个单词 
		for(j=0;j<5;j++){
			if(i==j)         //跳过该单词本身 
				continue;
			q=com(&a[i][0],&a[j][0]);
			if(q!=0){        //存储接龙方案 
				printf("接龙长度为：%d\n",strlen(q));
				n++;
			}
			else
				continue;
		}
	}
	printf("共有：%d种结果。\n",n);
} 

int main(){
	char a[5][N];           //二维字符数组存放五个单词 
	int i;
	
	printf("请输入五个长度为20以内的单词:\n");
	for(i=0;i<5;i++)       //for循环实现五个单词的输入 
		gets(&a[i][0]);
	
	len(a);
	return 0;
}